package com.example.springboot.utils;

/**
 * 功能：AES加密解密工具类

 * 日期：2024/1/17 21:20
 */



import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESUtil {

    /**
     * AES加密
     *
     * @param data   待加密数据
     * @param key    加密密钥
     * @param iv     加密向量
     * @return 加密后的数据
     * @throws Exception 加密过程中的异常
     */
    public static String encryptAES(String data, String key, String iv) throws Exception {
        // 创建AES加密算法实例
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        // 根据密钥生成SecretKeySpec对象
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");

        // 根据向量生成IvParameterSpec对象
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());

        // 初始化加密算法实例
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);

        // 加密数据
        byte[] encrypted = cipher.doFinal(data.getBytes());

        // 将加密后的结果转换为Base64字符串并返回
        return Base64.getEncoder().encodeToString(encrypted);
    }

    /**
     * AES解密
     *
     * @param data   待解密数据
     * @param key    解密密钥
     * @param iv     解密向量
     * @return 解密后的数据
     * @throws Exception 解密过程中的异常
     */
    public static String decryptAES(String data, String key, String iv) throws Exception {
        // 创建AES解密算法实例
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        // 根据密钥生成SecretKeySpec对象
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");

        // 根据向量生成IvParameterSpec对象
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());

        // 初始化解密算法实例
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);

        // 解密数据
        byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(data));

        // 将解密后的结果转换为字符串并返回
        return new String(decrypted);
    }
}

